package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Crianca;
import model.CriancaVacinas;
import model.Vacina;
import dao.CriancaDAO;
import dao.VacinaDAO;

public class CriancaController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest reqquest, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(reqquest, response);
	}
	
	private void doProcess(HttpServletRequest request,
			HttpServletResponse response) {
		//verifica qual acao deve executar
		if (request.getParameter("action") != null) {

			if(request.getParameter("action").toLowerCase().equals("vacinas_pendentes")){
				//lista a criancas com vacinas pendentes
				listarVacinasPendentes(request, response);
			}else if (request.getParameter("action").toLowerCase().equals("vacinas")) {
				//lista as vacina de uma crianca
				listarVacinas(request, response);
			} else if (request.getParameter("action").toLowerCase().equals("alterar")) {
				//efetua a alteracao dos dados de uma crianca
				alterarDadosCrianca(request, response);				
			}else {
				
				if (request.getParameter("action").toLowerCase().equals("registrar_vacina")) {
					//registra a aplicacao de uma vacina em uma crianca
					registrarVacina(request);
				}
				
				if (request.getParameter("action").toLowerCase().equals("salvar")) {
					//efetua o cadastro de uma crianca
					cadastrarCrianca(request);
				}

				if (request.getParameter("action").toLowerCase().equals("excluir")) {
					//exclui os dados de uma crianca
					excluirDadosCrianca(request);
				}				
				//lista os dados das criancas existentes na base de dados
				listarCriancas(request, response);
			}

		} else {
			//lista os dados das criancas existentes na base de dados
			listarCriancas(request, response);
		}
		

	}

	private void listarVacinasPendentes(HttpServletRequest request,
			HttpServletResponse response) {
		
		List<CriancaVacinas> lista = new ArrayList<CriancaVacinas>();
		
		//lista todas as criancas da base de dadis
		List<Crianca> criancas = new CriancaDAO().listAll();
		VacinaDAO vacinaDAO = new VacinaDAO();
		
		//percorre a lista de criancas e busca suas respectivas vacinas pendentes de aplicacao
		for (Crianca crianca : criancas) {
			lista.add(vacinaDAO.list(crianca));
		}
		
		//seta a lista de criancas nos atributos do request 
		request.setAttribute("criancas", lista);
		try {
			//direciona para a lista de vacinas pendentes
			request.getRequestDispatcher("vacinas_pendentes.jsp").forward(
					request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void registrarVacina(HttpServletRequest request) {
		CriancaDAO criancaDAO = new CriancaDAO();
		//extrai o codigo da crianca e das vacinas a serem aplicadas
		Integer codigoCrianca = Integer.valueOf(request.getParameter("crianca"));
		String[] vacinas = request.getParameterValues("vacinas");
		
		//percorre a lista de codigos de vacinas registrando a mesma para a cianca
		for (String vacina : vacinas) {
			criancaDAO.aplicarVacina(codigoCrianca, Integer.valueOf(vacina));
		}
	}

	private void listarCriancas(HttpServletRequest request,
			HttpServletResponse response) {
		//lista os dados das criancas cadastradas na base de dados
		List<Crianca> criancas = new CriancaDAO().listAll();
		
		//seta a lista de criancas nos parametros do request
		request.setAttribute("listagem_criancas", criancas);

		try {
			//direciona para a tela de listagem de criancas
			request.getRequestDispatcher("listagem_criancas.jsp").forward(
					request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doProcess(request, response);
	}
	
	

	private void alterarDadosCrianca(HttpServletRequest request,
			HttpServletResponse response) {
		//extrai o parametro do request e busca os dados da crianca na base de dados
		Crianca crianca = new CriancaDAO().find(Integer.parseInt(request.getParameter("codigo")));
		
		//seta a crianca nos parametros de request
		request.setAttribute("crianca", crianca);
		try {
			//direciona para pagina de cadastro/alteracao de criancas
			request.getRequestDispatcher("cadastro_crianca.jsp").forward(
					request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void excluirDadosCrianca(HttpServletRequest request){
		//remove o registro da crianca da tabela de criancas
		new CriancaDAO().delete(Integer.parseInt(request.getParameter("codigo")));
	}
	
	private void cadastrarCrianca(HttpServletRequest request){
		Crianca crianca = new Crianca();
		//extrai os parametros do request e cria um objeto que representa uma crianca
		if(request.getParameter("codigo") != null && !request.getParameter("codigo").equals("")){
			crianca.setCodigo(Integer.parseInt(request.getParameter("codigo")));
		}
		crianca.setNome(request.getParameter("nome"));
		crianca.setIdade(Integer.parseInt(request.getParameter("idade")));
		crianca.setNomePai(request.getParameter("nomePai"));
		crianca.setNomeMae(request.getParameter("nomeMae"));
		crianca.setTelefone(request.getParameter("telefone"));
		//persiste o objeto crianca na base de dados
		new CriancaDAO().save(crianca);
	}
	
	private void listarVacinas(HttpServletRequest request,
			HttpServletResponse response) {
		//extrai o codigo da crianca recebido no request
		Integer codigoCrianca = Integer.valueOf(request.getParameter("codigo"));

		//busca as vacinas da crianca
		List<Vacina> vacinas = new VacinaDAO().listAll();

		//seta os dados no request
		request.setAttribute("listagem_vacinas", vacinas);
		request.setAttribute("crianca", codigoCrianca);

		try {
			//direciona para a pagina de vacinas para aplicacao 
			request.getRequestDispatcher("vacina_crianca.jsp").forward(request,
					response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
